<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
<meta name="generator" content="pdoc 0.9.1" />
<title>tronpytool.common.threads API documentation</title>
<meta name="description" content="A minimal implementation of the various gevent APIs used within this codebase." />
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/sanitize.min.css" integrity="sha256-PK9q560IAAa6WVRRh76LtCaI8pjTJ2z11v0miyNNjrs=" crossorigin>
<link rel="preload stylesheet" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/11.0.1/typography.min.css" integrity="sha256-7l/o7C8jubJiy74VsKTidCy1yBkRtiUGbVkYBylBqUg=" crossorigin>
<link rel="stylesheet preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/styles/github.min.css" crossorigin>
<style>:root{--highlight-color:#fe9}.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}#sidebar > *:last-child{margin-bottom:2cm}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}h1:target,h2:target,h3:target,h4:target,h5:target,h6:target{background:var(--highlight-color);padding:.2em 0}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{margin-top:.6em;font-weight:bold}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}dt:target .name{background:var(--highlight-color)}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}td{padding:0 .5em}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%;height:100vh;overflow:auto;position:sticky;top:0}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/10.1.1/highlight.min.js" integrity="sha256-Uv3H6lx7dJmRfRvH8TH6kJD1TSK1aFcwgx+mdg3epi8=" crossorigin></script>
<script>window.addEventListener('DOMContentLoaded', () => hljs.initHighlighting())</script>
</head>
<body>
<main>
<article id="content">
<header>
<h1 class="title">Module <code>tronpytool.common.threads</code></h1>
</header>
<section id="section-intro">
<p>A minimal implementation of the various gevent APIs used within this codebase.</p>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">&#34;&#34;&#34;
A minimal implementation of the various gevent APIs used within this codebase.
&#34;&#34;&#34;
import threading
import time


class Timeout(Exception):
    &#34;&#34;&#34;
    A limited subset of the `gevent.Timeout` context manager.
    &#34;&#34;&#34;
    seconds = None
    exception = None
    begun_at = None
    is_running = None

    def __init__(self, seconds=None, exception=None, *args, **kwargs):
        self.seconds = seconds
        self.exception = exception

    def __enter__(self):
        self.start()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        return False

    def __str__(self):
        if self.seconds is None:
            return &#39;&#39;
        return &#34;{0} seconds&#34;.format(self.seconds)

    @property
    def expire_at(self):
        if self.seconds is None:
            raise ValueError(&#34;Timeouts with `seconds == None` do not have an expiration time&#34;)
        elif self.begun_at is None:
            raise ValueError(&#34;Timeout has not been started&#34;)
        return self.begun_at + self.seconds

    def start(self):
        if self.is_running is not None:
            raise ValueError(&#34;Timeout has already been started&#34;)
        self.begun_at = time.time()
        self.is_running = True

    def check(self):
        if self.is_running is None:
            raise ValueError(&#34;Timeout has not been started&#34;)
        elif self.is_running is False:
            raise ValueError(&#34;Timeout has already been cancelled&#34;)
        elif self.seconds is None:
            return
        elif time.time() &gt; self.expire_at:
            self.is_running = False
            if isinstance(self.exception, type):
                raise self.exception(str(self))
            elif isinstance(self.exception, Exception):
                raise self.exception
            else:
                raise self

    def cancel(self):
        self.is_running = False

    def sleep(self, seconds):
        time.sleep(seconds)
        self.check()


class ThreadWithReturn(threading.Thread):
    def __init__(self, target=None, args=None, kwargs=None):
        super().__init__(
            target=target,
            args=args or tuple(),
            kwargs=kwargs or {},
        )
        self.target = target
        self.args = args
        self.kwargs = kwargs

    def run(self):
        self._return = self.target(*self.args, **self.kwargs)

    def get(self, timeout=None):
        self.join(timeout)
        try:
            return self._return
        except AttributeError:
            raise RuntimeError(&#34;Something went wrong.  No `_return` property was set&#34;)


class TimerClass(threading.Thread):
    def __init__(self, interval, callback, *args):
        threading.Thread.__init__(self)
        self.callback = callback
        self.terminate_event = threading.Event()
        self.interval = interval
        self.args = args

    def run(self):
        while not self.terminate_event.is_set():
            self.callback(*self.args)
            self.terminate_event.wait(self.interval)

    def stop(self):
        self.terminate_event.set()


def spawn(target, *args, thread_class=ThreadWithReturn, **kwargs):
    thread = thread_class(
        target=target,
        args=args,
        kwargs=kwargs,
    )
    thread.daemon = True
    thread.start()
    return thread</code></pre>
</details>
</section>
<section>
</section>
<section>
</section>
<section>
<h2 class="section-title" id="header-functions">Functions</h2>
<dl>
<dt id="tronpytool.common.threads.spawn"><code class="name flex">
<span>def <span class="ident">spawn</span></span>(<span>target, *args, thread_class=tronpytool.common.threads.ThreadWithReturn, **kwargs)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def spawn(target, *args, thread_class=ThreadWithReturn, **kwargs):
    thread = thread_class(
        target=target,
        args=args,
        kwargs=kwargs,
    )
    thread.daemon = True
    thread.start()
    return thread</code></pre>
</details>
</dd>
</dl>
</section>
<section>
<h2 class="section-title" id="header-classes">Classes</h2>
<dl>
<dt id="tronpytool.common.threads.ThreadWithReturn"><code class="flex name class">
<span>class <span class="ident">ThreadWithReturn</span></span>
<span>(</span><span>target=None, args=None, kwargs=None)</span>
</code></dt>
<dd>
<div class="desc"><p>A class that represents a thread of control.</p>
<p>This class can be safely subclassed in a limited fashion. There are two ways
to specify the activity: by passing a callable object to the constructor, or
by overriding the run() method in a subclass.</p>
<p>This constructor should always be called with keyword arguments. Arguments are:</p>
<p><em>group</em> should be None; reserved for future extension when a ThreadGroup
class is implemented.</p>
<p><em>target</em> is the callable object to be invoked by the run()
method. Defaults to None, meaning nothing is called.</p>
<p><em>name</em> is the thread name. By default, a unique name is constructed of
the form "Thread-N" where N is a small decimal number.</p>
<p><em>args</em> is the argument tuple for the target invocation. Defaults to ().</p>
<p><em>kwargs</em> is a dictionary of keyword arguments for the target
invocation. Defaults to {}.</p>
<p>If a subclass overrides the constructor, it must make sure to invoke
the base class constructor (Thread.<strong>init</strong>()) before doing anything
else to the thread.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class ThreadWithReturn(threading.Thread):
    def __init__(self, target=None, args=None, kwargs=None):
        super().__init__(
            target=target,
            args=args or tuple(),
            kwargs=kwargs or {},
        )
        self.target = target
        self.args = args
        self.kwargs = kwargs

    def run(self):
        self._return = self.target(*self.args, **self.kwargs)

    def get(self, timeout=None):
        self.join(timeout)
        try:
            return self._return
        except AttributeError:
            raise RuntimeError(&#34;Something went wrong.  No `_return` property was set&#34;)</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li>threading.Thread</li>
</ul>
<h3>Methods</h3>
<dl>
<dt id="tronpytool.common.threads.ThreadWithReturn.get"><code class="name flex">
<span>def <span class="ident">get</span></span>(<span>self, timeout=None)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def get(self, timeout=None):
    self.join(timeout)
    try:
        return self._return
    except AttributeError:
        raise RuntimeError(&#34;Something went wrong.  No `_return` property was set&#34;)</code></pre>
</details>
</dd>
<dt id="tronpytool.common.threads.ThreadWithReturn.run"><code class="name flex">
<span>def <span class="ident">run</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"><p>Method representing the thread's activity.</p>
<p>You may override this method in a subclass. The standard run() method
invokes the callable object passed to the object's constructor as the
target argument, if any, with sequential and keyword arguments taken
from the args and kwargs arguments, respectively.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def run(self):
    self._return = self.target(*self.args, **self.kwargs)</code></pre>
</details>
</dd>
</dl>
</dd>
<dt id="tronpytool.common.threads.Timeout"><code class="flex name class">
<span>class <span class="ident">Timeout</span></span>
<span>(</span><span>seconds=None, exception=None, *args, **kwargs)</span>
</code></dt>
<dd>
<div class="desc"><p>A limited subset of the <code>gevent.Timeout</code> context manager.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class Timeout(Exception):
    &#34;&#34;&#34;
    A limited subset of the `gevent.Timeout` context manager.
    &#34;&#34;&#34;
    seconds = None
    exception = None
    begun_at = None
    is_running = None

    def __init__(self, seconds=None, exception=None, *args, **kwargs):
        self.seconds = seconds
        self.exception = exception

    def __enter__(self):
        self.start()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        return False

    def __str__(self):
        if self.seconds is None:
            return &#39;&#39;
        return &#34;{0} seconds&#34;.format(self.seconds)

    @property
    def expire_at(self):
        if self.seconds is None:
            raise ValueError(&#34;Timeouts with `seconds == None` do not have an expiration time&#34;)
        elif self.begun_at is None:
            raise ValueError(&#34;Timeout has not been started&#34;)
        return self.begun_at + self.seconds

    def start(self):
        if self.is_running is not None:
            raise ValueError(&#34;Timeout has already been started&#34;)
        self.begun_at = time.time()
        self.is_running = True

    def check(self):
        if self.is_running is None:
            raise ValueError(&#34;Timeout has not been started&#34;)
        elif self.is_running is False:
            raise ValueError(&#34;Timeout has already been cancelled&#34;)
        elif self.seconds is None:
            return
        elif time.time() &gt; self.expire_at:
            self.is_running = False
            if isinstance(self.exception, type):
                raise self.exception(str(self))
            elif isinstance(self.exception, Exception):
                raise self.exception
            else:
                raise self

    def cancel(self):
        self.is_running = False

    def sleep(self, seconds):
        time.sleep(seconds)
        self.check()</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li>builtins.Exception</li>
<li>builtins.BaseException</li>
</ul>
<h3>Class variables</h3>
<dl>
<dt id="tronpytool.common.threads.Timeout.begun_at"><code class="name">var <span class="ident">begun_at</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="tronpytool.common.threads.Timeout.exception"><code class="name">var <span class="ident">exception</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="tronpytool.common.threads.Timeout.is_running"><code class="name">var <span class="ident">is_running</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
<dt id="tronpytool.common.threads.Timeout.seconds"><code class="name">var <span class="ident">seconds</span></code></dt>
<dd>
<div class="desc"></div>
</dd>
</dl>
<h3>Instance variables</h3>
<dl>
<dt id="tronpytool.common.threads.Timeout.expire_at"><code class="name">var <span class="ident">expire_at</span></code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">@property
def expire_at(self):
    if self.seconds is None:
        raise ValueError(&#34;Timeouts with `seconds == None` do not have an expiration time&#34;)
    elif self.begun_at is None:
        raise ValueError(&#34;Timeout has not been started&#34;)
    return self.begun_at + self.seconds</code></pre>
</details>
</dd>
</dl>
<h3>Methods</h3>
<dl>
<dt id="tronpytool.common.threads.Timeout.cancel"><code class="name flex">
<span>def <span class="ident">cancel</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def cancel(self):
    self.is_running = False</code></pre>
</details>
</dd>
<dt id="tronpytool.common.threads.Timeout.check"><code class="name flex">
<span>def <span class="ident">check</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def check(self):
    if self.is_running is None:
        raise ValueError(&#34;Timeout has not been started&#34;)
    elif self.is_running is False:
        raise ValueError(&#34;Timeout has already been cancelled&#34;)
    elif self.seconds is None:
        return
    elif time.time() &gt; self.expire_at:
        self.is_running = False
        if isinstance(self.exception, type):
            raise self.exception(str(self))
        elif isinstance(self.exception, Exception):
            raise self.exception
        else:
            raise self</code></pre>
</details>
</dd>
<dt id="tronpytool.common.threads.Timeout.sleep"><code class="name flex">
<span>def <span class="ident">sleep</span></span>(<span>self, seconds)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def sleep(self, seconds):
    time.sleep(seconds)
    self.check()</code></pre>
</details>
</dd>
<dt id="tronpytool.common.threads.Timeout.start"><code class="name flex">
<span>def <span class="ident">start</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def start(self):
    if self.is_running is not None:
        raise ValueError(&#34;Timeout has already been started&#34;)
    self.begun_at = time.time()
    self.is_running = True</code></pre>
</details>
</dd>
</dl>
</dd>
<dt id="tronpytool.common.threads.TimerClass"><code class="flex name class">
<span>class <span class="ident">TimerClass</span></span>
<span>(</span><span>interval, callback, *args)</span>
</code></dt>
<dd>
<div class="desc"><p>A class that represents a thread of control.</p>
<p>This class can be safely subclassed in a limited fashion. There are two ways
to specify the activity: by passing a callable object to the constructor, or
by overriding the run() method in a subclass.</p>
<p>This constructor should always be called with keyword arguments. Arguments are:</p>
<p><em>group</em> should be None; reserved for future extension when a ThreadGroup
class is implemented.</p>
<p><em>target</em> is the callable object to be invoked by the run()
method. Defaults to None, meaning nothing is called.</p>
<p><em>name</em> is the thread name. By default, a unique name is constructed of
the form "Thread-N" where N is a small decimal number.</p>
<p><em>args</em> is the argument tuple for the target invocation. Defaults to ().</p>
<p><em>kwargs</em> is a dictionary of keyword arguments for the target
invocation. Defaults to {}.</p>
<p>If a subclass overrides the constructor, it must make sure to invoke
the base class constructor (Thread.<strong>init</strong>()) before doing anything
else to the thread.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">class TimerClass(threading.Thread):
    def __init__(self, interval, callback, *args):
        threading.Thread.__init__(self)
        self.callback = callback
        self.terminate_event = threading.Event()
        self.interval = interval
        self.args = args

    def run(self):
        while not self.terminate_event.is_set():
            self.callback(*self.args)
            self.terminate_event.wait(self.interval)

    def stop(self):
        self.terminate_event.set()</code></pre>
</details>
<h3>Ancestors</h3>
<ul class="hlist">
<li>threading.Thread</li>
</ul>
<h3>Methods</h3>
<dl>
<dt id="tronpytool.common.threads.TimerClass.run"><code class="name flex">
<span>def <span class="ident">run</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"><p>Method representing the thread's activity.</p>
<p>You may override this method in a subclass. The standard run() method
invokes the callable object passed to the object's constructor as the
target argument, if any, with sequential and keyword arguments taken
from the args and kwargs arguments, respectively.</p></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def run(self):
    while not self.terminate_event.is_set():
        self.callback(*self.args)
        self.terminate_event.wait(self.interval)</code></pre>
</details>
</dd>
<dt id="tronpytool.common.threads.TimerClass.stop"><code class="name flex">
<span>def <span class="ident">stop</span></span>(<span>self)</span>
</code></dt>
<dd>
<div class="desc"></div>
<details class="source">
<summary>
<span>Expand source code</span>
</summary>
<pre><code class="python">def stop(self):
    self.terminate_event.set()</code></pre>
</details>
</dd>
</dl>
</dd>
</dl>
</section>
</article>
<nav id="sidebar">
<h1>Index</h1>
<div class="toc">
<ul></ul>
</div>
<ul id="index">
<li><h3>Super-module</h3>
<ul>
<li><code><a title="tronpytool.common" href="index.html">tronpytool.common</a></code></li>
</ul>
</li>
<li><h3><a href="#header-functions">Functions</a></h3>
<ul class="">
<li><code><a title="tronpytool.common.threads.spawn" href="#tronpytool.common.threads.spawn">spawn</a></code></li>
</ul>
</li>
<li><h3><a href="#header-classes">Classes</a></h3>
<ul>
<li>
<h4><code><a title="tronpytool.common.threads.ThreadWithReturn" href="#tronpytool.common.threads.ThreadWithReturn">ThreadWithReturn</a></code></h4>
<ul class="">
<li><code><a title="tronpytool.common.threads.ThreadWithReturn.get" href="#tronpytool.common.threads.ThreadWithReturn.get">get</a></code></li>
<li><code><a title="tronpytool.common.threads.ThreadWithReturn.run" href="#tronpytool.common.threads.ThreadWithReturn.run">run</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="tronpytool.common.threads.Timeout" href="#tronpytool.common.threads.Timeout">Timeout</a></code></h4>
<ul class="two-column">
<li><code><a title="tronpytool.common.threads.Timeout.begun_at" href="#tronpytool.common.threads.Timeout.begun_at">begun_at</a></code></li>
<li><code><a title="tronpytool.common.threads.Timeout.cancel" href="#tronpytool.common.threads.Timeout.cancel">cancel</a></code></li>
<li><code><a title="tronpytool.common.threads.Timeout.check" href="#tronpytool.common.threads.Timeout.check">check</a></code></li>
<li><code><a title="tronpytool.common.threads.Timeout.exception" href="#tronpytool.common.threads.Timeout.exception">exception</a></code></li>
<li><code><a title="tronpytool.common.threads.Timeout.expire_at" href="#tronpytool.common.threads.Timeout.expire_at">expire_at</a></code></li>
<li><code><a title="tronpytool.common.threads.Timeout.is_running" href="#tronpytool.common.threads.Timeout.is_running">is_running</a></code></li>
<li><code><a title="tronpytool.common.threads.Timeout.seconds" href="#tronpytool.common.threads.Timeout.seconds">seconds</a></code></li>
<li><code><a title="tronpytool.common.threads.Timeout.sleep" href="#tronpytool.common.threads.Timeout.sleep">sleep</a></code></li>
<li><code><a title="tronpytool.common.threads.Timeout.start" href="#tronpytool.common.threads.Timeout.start">start</a></code></li>
</ul>
</li>
<li>
<h4><code><a title="tronpytool.common.threads.TimerClass" href="#tronpytool.common.threads.TimerClass">TimerClass</a></code></h4>
<ul class="">
<li><code><a title="tronpytool.common.threads.TimerClass.run" href="#tronpytool.common.threads.TimerClass.run">run</a></code></li>
<li><code><a title="tronpytool.common.threads.TimerClass.stop" href="#tronpytool.common.threads.TimerClass.stop">stop</a></code></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</main>
<footer id="footer">
<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.9.1</a>.</p>
</footer>
</body>
</html>